/**
 * 游戏订单管理Servlet
 * 
 * 功能说明：
 * 1. 订单管理：
 *    - 查看所有游戏订单列表
 *    - 查看单个订单详情
 *    - 添加新的游戏订单
 *    - 更新订单状态（如：待付款、已付款、已发货等）
 *    - 删除订单记录
 * 
 * 2. 数据展示：
 *    - 订单基本信息：订单ID、总金额、数量、状态
 *    - 游戏信息：游戏名称、游戏图片、游戏描述、游戏链接
 *    - 支付信息：支付方式、支付状态
 *    - 用户信息：用户ID、用户名
 *    - 时间信息：订单创建时间
 * 
 * 3. 权限控制：
 *    - 管理员可以查看和管理所有订单
 *    - 普通用户只能查看自己的订单
 * 
 * 4. 日志记录：
 *    - 记录所有订单操作（添加、更新、删除）
 *    - 记录操作人员和操作时间
 *    - 记录操作结果
 * 
 * 数据库表结构：
 * game_order表：
 * - id: 订单ID（主键）
 * - total: 订单总金额
 * - amount: 购买数量
 * - status: 订单状态
 * - paytype: 支付方式
 * - gamename: 游戏名称
 * - gameimg: 游戏图片URL
 * - gamelink: 游戏下载链接
 * - gametxt: 游戏描述
 * - user_id: 用户ID（外键）
 * - datetime: 订单创建时间
 */
package com.example.cloudcity.servlet;

// 导入必要的Jakarta Servlet相关类
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
// 导入JSON处理相关类
import com.google.gson.Gson;
import com.google.gson.JsonObject;
// 导入日志工具类
import com.example.cloudcity.utils.LogUtils;

// 导入Java标准库
import java.io.*;
import java.sql.*;
import java.util.*;

/**
 * 游戏订单管理Servlet类
 * 继承HttpServlet，提供游戏订单管理的Web接口
 */
public class GameOrderManageServlet extends HttpServlet {
    // 数据库连接配置常量
    private static final String DB_URL = "jdbc:mysql://localhost:3306/game";  // 数据库URL
    private static final String USER = "root";      // 数据库用户名
    private static final String PASS = "1234";    // 数据库密码
    // 创建Gson对象用于JSON处理
    private final Gson gson = new Gson();

    /**
     * 处理GET请求的方法
     * 主要用于处理查询相关的操作
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应内容类型为JSON，使用UTF-8编码
        response.setContentType("application/json;charset=UTF-8");
        // 获取请求中的action参数，确定具体操作类型
        String action = request.getParameter("action");

        try {
            // 根据不同的action参数执行相应的操作
            switch (action) {
                case "list":
                    // 获取订单列表
                    listOrders(response);
                    break;
                case "get":
                    // 获取单个订单详情
                    getOrder(request, response);
                    break;
                default:
                    // 处理未知的action参数
                    sendError(response, "Unknown action: " + action);
            }
        } catch (Exception e) {
            // 异常处理：打印堆栈信息并返回错误信息
            e.printStackTrace();
            sendError(response, e.getMessage());
        }
    }

    /**
     * 处理POST请求的方法
     * 主要用于处理添加、更新、删除等修改操作
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应内容类型为JSON，使用UTF-8编码
        response.setContentType("application/json;charset=UTF-8");

        try {
            // 读取请求体中的JSON数据
            StringBuilder sb = new StringBuilder();
            try (BufferedReader reader = request.getReader()) {
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            }

            // 解析JSON数据
            JsonObject jsonData = gson.fromJson(sb.toString(), JsonObject.class);
            String action = jsonData.get("action").getAsString();

            // 根据不同的action参数执行相应的操作
            switch (action) {
                case "add":
                    // 添加新订单
                    addOrder(jsonData, request, response);
                    break;
                case "update":
                    // 更新订单信息
                    updateOrder(jsonData, request, response);
                    break;
                case "delete":
                    // 删除订单
                    deleteOrder(jsonData, request, response);
                    break;
                default:
                    // 处理未知的action参数
                    sendError(response, "Unknown action: " + action);
            }
        } catch (Exception e) {
            // 异常处理：打印堆栈信息并返回错误信息
            e.printStackTrace();
            sendError(response, e.getMessage());
        }
    }

    /**
     * 获取订单列表的方法
     * @param response HTTP响应对象
     * @throws SQLException 数据库操作异常
     * @throws IOException IO操作异常
     */
    private void listOrders(HttpServletResponse response) throws SQLException, IOException {
        // 创建列表存储订单信息
        List<Map<String, Object>> orders = new ArrayList<>();

        // 建立数据库连接并执行查询
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             PreparedStatement stmt = conn.prepareStatement(
                     // SQL查询语句：联合查询订单表和用户表，按时间降序排序
                     "SELECT o.*, u.username FROM game_order o " +
                             "JOIN users u ON o.user_id = u.id " +
                             "ORDER BY o.datetime DESC")) {

            // 执行查询并处理结果集
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                // 将每个订单信息存入Map
                Map<String, Object> order = new HashMap<>();
                order.put("id", rs.getLong("id"));                     // 订单ID
                order.put("total", rs.getBigDecimal("total"));         // 订单总额
                order.put("amount", rs.getBigDecimal("amount"));       // 订单数量
                order.put("status", rs.getString("status"));           // 订单状态
                order.put("paytype", rs.getString("paytype"));         // 支付方式
                order.put("gamename", rs.getString("gamename"));       // 游戏名称
                order.put("gameimg", rs.getString("gameimg"));         // 游戏图片
                order.put("gametxt", rs.getString("gametxt"));         // 游戏描述
                order.put("datetime", rs.getTimestamp("datetime"));    // 订单时间
                order.put("user_id", rs.getLong("user_id"));          // 用户ID
                orders.add(order);
            }
        }

        // 将订单列表转换为JSON并写入响应
        response.getWriter().write(gson.toJson(orders));
    }

    /**
     * 获取单个订单详情的方法
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @throws SQLException 数据库操作异常
     * @throws IOException IO操作异常
     */
    private void getOrder(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        // 获取订单ID参数
        long orderId = Long.parseLong(request.getParameter("id"));

        // 建立数据库连接并执行查询
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             PreparedStatement stmt = conn.prepareStatement(
                     // SQL查询语句：联合查询订单表和用户表
                     "SELECT o.*, u.username FROM game_order o " +
                             "JOIN users u ON o.user_id = u.id " +
                             "WHERE o.id = ?")) {

            // 设置查询参数
            stmt.setLong(1, orderId);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                // 将订单信息存入Map
                Map<String, Object> order = new HashMap<>();
                order.put("id", rs.getLong("id"));                     // 订单ID
                order.put("total", rs.getBigDecimal("total"));         // 订单总额
                order.put("amount", rs.getBigDecimal("amount"));       // 订单数量
                order.put("status", rs.getString("status"));           // 订单状态
                order.put("paytype", rs.getString("paytype"));         // 支付方式
                order.put("gamename", rs.getString("gamename"));       // 游戏名称
                order.put("gameimg", rs.getString("gameimg"));         // 游戏图片
                order.put("gamelink", rs.getString("gamelink"));       // 游戏链接
                order.put("datetime", rs.getTimestamp("datetime"));    // 订单时间
                order.put("username", rs.getString("username"));       // 用户名

                // 将订单信息转换为JSON并写入响应
                response.getWriter().write(gson.toJson(order));
            } else {
                // 订单不存在时返回错误信息
                sendError(response, "Order not found");
            }
        }
    }

    /**
     * 添加新订单的方法
     * @param jsonData JSON格式的订单数据
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @throws SQLException 数据库操作异常
     * @throws IOException IO操作异常
     */
    private void addOrder(JsonObject jsonData, HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        // 建立数据库连接并执行插入操作
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
             PreparedStatement stmt = conn.prepareStatement(
                     // SQL插入语句：添加新订单记录
                     "INSERT INTO game_order (total, amount, status, paytype, gamename, gameimg, gamelink, user_id) " +
                             "VALUES (?, ?, ?, ?, ?, ?, ?, ?)")) {

            // 设置SQL参数
            stmt.setBigDecimal(1, jsonData.get("total").getAsBigDecimal());     // 订单总额
            stmt.setBigDecimal(2, jsonData.get("amount").getAsBigDecimal());    // 订单数量
            stmt.setString(3, jsonData.get("status").getAsString());            // 订单状态
            stmt.setString(4, jsonData.get("paytype").getAsString());           // 支付方式
            stmt.setString(5, jsonData.get("gamename").getAsString());          // 游戏名称
            stmt.setString(6, jsonData.get("gameimg").getAsString());           // 游戏图片
            stmt.setString(7, jsonData.get("gamelink").getAsString());          // 游戏链接
            stmt.setLong(8, jsonData.get("user_id").getAsLong());              // 用户ID

            // 执行插入操作
            int result = stmt.executeUpdate();

            if (result > 0) {
                // 添加成功，记录操作日志
                LogUtils.logOperation(
                        "添加订单",
                        "添加新订单: " + jsonData.get("gamename").getAsString(),
                        (String) request.getSession().getAttribute("username"),
                        request,
                        "成功"
                );
                // 返回成功响应
                response.getWriter().write("{\"success\": true}");
            } else {
                // 添加失败，返回错误信息
                sendError(response, "Failed to add order");
            }
        }
    }

    /**
     * 更新订单状态的方法
     * @param jsonData JSON格式的订单数据
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @throws SQLException 数据库操作异常
     * @throws IOException IO操作异常
     */
    private void updateOrder(JsonObject jsonData, HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        try {
            // 从JSON数据中获取订单ID和新状态
            long orderId = jsonData.get("id").getAsLong();
            String status = jsonData.get("status").getAsString();

            // 建立数据库连接并执行更新操作
            try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                 PreparedStatement stmt = conn.prepareStatement(
                         // SQL更新语句：更新订单状态
                         "UPDATE game_order SET status = ? WHERE id = ?")) {

                // 设置SQL参数
                stmt.setString(1, status);      // 新状态
                stmt.setLong(2, orderId);       // 订单ID

                // 执行更新操作
                int result = stmt.executeUpdate();

                if (result > 0) {
                    // 更新成功，记录操作日志
                    LogUtils.logOperation(
                            "更新订单",
                            "更新订单ID" + orderId + "状态为" + status,
                            (String) request.getSession().getAttribute("username"),
                            request,
                            "成功"
                    );

                    // 返回成功响应
                    JsonObject response_data = new JsonObject();
                    response_data.addProperty("success", true);
                    response_data.addProperty("message", "订单状态更新成功");
                    response.getWriter().write(gson.toJson(response_data));
                } else {
                    // 订单不存在，返回错误响应
                    JsonObject error_response = new JsonObject();
                    error_response.addProperty("success", false);
                    error_response.addProperty("error", "未找到要更新的订单");
                    response.getWriter().write(gson.toJson(error_response));
                }
            }
        } catch (Exception e) {
            // 异常处理：打印错误信息并返回错误响应
            System.err.println("Error updating order: " + e.getMessage());
            e.printStackTrace();
            JsonObject error_response = new JsonObject();
            error_response.addProperty("success", false);
            error_response.addProperty("error", e.getMessage());
            response.getWriter().write(gson.toJson(error_response));
        }
    }

    /**
     * 删除订单的方法
     * @param jsonData JSON格式的订单数据
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @throws SQLException 数据库操作异常
     * @throws IOException IO操作异常
     */
    private void deleteOrder(JsonObject jsonData, HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        try {
            // 从JSON数据中获取订单ID
            long orderId = jsonData.get("id").getAsLong();

            // 建立数据库连接并执行删除操作
            try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
                 PreparedStatement stmt = conn.prepareStatement(
                         // SQL删除语句：删除指定订单
                         "DELETE FROM game_order WHERE id = ?")) {

                // 设置SQL参数
                stmt.setLong(1, orderId);

                // 执行删除操作
                int result = stmt.executeUpdate();

                if (result > 0) {
                    // 删除成功，记录操作日志
                    LogUtils.logOperation(
                            "删除订单",
                            "删除订单ID: " + orderId,
                            (String) request.getSession().getAttribute("username"),
                            request,
                            "成功"
                    );

                    // 返回成功响应
                    JsonObject response_data = new JsonObject();
                    response_data.addProperty("success", true);
                    response_data.addProperty("message", "订单删除成功");
                    response.getWriter().write(gson.toJson(response_data));
                } else {
                    // 订单不存在，返回错误响应
                    JsonObject error_response = new JsonObject();
                    error_response.addProperty("success", false);
                    error_response.addProperty("error", "未找到要删除的订单");
                    response.getWriter().write(gson.toJson(error_response));
                }
            }
        } catch (Exception e) {
            // 异常处理：打印错误信息并返回错误响应
            System.err.println("Error deleting order: " + e.getMessage());
            e.printStackTrace();
            JsonObject error_response = new JsonObject();
            error_response.addProperty("success", false);
            error_response.addProperty("error", e.getMessage());
            response.getWriter().write(gson.toJson(error_response));
        }
    }

    /**
     * 发送错误响应的辅助方法
     * @param response HTTP响应对象
     * @param message 错误信息
     * @throws IOException IO操作异常
     */
    private void sendError(HttpServletResponse response, String message) throws IOException {
        // 创建JSON对象存储错误信息
        JsonObject json = new JsonObject();
        json.addProperty("success", false);     // 设置成功标志为false
        json.addProperty("error", message);     // 设置错误信息
        // 将错误信息写入响应
        response.getWriter().write(json.toString());
    }
}